/**
|--------------------------------------------------------------
| AdmCliente.java
|--------------------------------------------------------------
| @Autor: David Ccapa Gil
| @Fecha de creacion: 01/10/2012
| @Fecha de la ultima modificacion: 01/10/2012
| @Universidad Peruana de Ciencias Aplicadas
|--------------------------------------------------------------
*/
package appbenedictoxvi;

import java.util.ArrayList;

/**
 *
 * @author David
 */
public class AdmCliente {
    private ArrayList<Cliente> clientes;
    Validaciones objVal = new Validaciones();

    public AdmCliente() {
        clientes = new ArrayList<Cliente>();
    }

    public ArrayList<Cliente> getClientes(){
        return clientes;
    }
        
    public void registarCliente(String idcodigo, String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono, 
            String fechacontacto, String estado, String fechapase) throws BusinessException{

        //Validacion de datos
        validarDatos(idcodigo, nombres, apellidopaterno, apellidomaterno, email, dni, telefono);
        
        //Insertamos en la clase
        Cliente cliente = new Cliente(idcodigo, nombres, apellidopaterno, apellidomaterno, 
                email, dni, telefono, fechacontacto, estado, fechapase);
        
        //Insertamos en la coleccion
        clientes.add(cliente);
    }

    public Cliente buscarCliente(String idcodigo) {
        for (Cliente cliente : clientes) {
            if (cliente.getIdcodigo().equals(idcodigo)) {
                return cliente;
            }
        }
        return null;
    }

    private void validarDatos(String idcodigo, String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono) throws BusinessException{
        validarDatosMandatorios(idcodigo, nombres, apellidopaterno, apellidomaterno, email, dni, telefono);
        validarDuplicidad(idcodigo);
    }

    private void validarDatosMandatorios(String idcodigo, String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono) throws BusinessException{
        String mensaje = "";
        
        if (!objVal.isSet(idcodigo)) {
            mensaje += "Codigo no puede ser vacio o nulo";
        }
        if (!objVal.isSet(nombres)) {
            mensaje += "Nombre no puede ser vacio o nulo";
        }
        if (!objVal.isSet(apellidopaterno)) {
            mensaje += "Apellodo Paterno no puede ser vacio o nulo";
        }
        if (!objVal.isSet(apellidomaterno)) {
            mensaje += "Apellido Materno no puede ser vacio o nulo";
        }
        if (!objVal.isEmail(email)) {
            mensaje += "E-mail no puede ser vacio o nulo";
        }
        //if (!objVal.isDni(dni)) {
        //    mensaje += "DNI no puede ser vacio o nulo";
        //}
        //if (!objVal.isSet(telefono)) {
        //    mensaje += "Telefono no puede ser vacio o nulo";
        //}
        
        if (objVal.isSet(mensaje)) {
            throw new BusinessException(mensaje);
        }
    }

    private void validarDuplicidad(String idcodigo) throws BusinessException{
        if (buscarCliente(idcodigo) != null) {
            String mensaje = "Error: " + idcodigo + " ya existe";
            //Crea la excepcion y lanzarlo
            throw new BusinessException(mensaje);
        }
    }

    public void eliminarCliente(String idcodigo) throws BusinessException{
        Cliente cliente = buscarCliente(idcodigo);
        if (cliente != null) {
            clientes.remove(cliente);
        } else {
            validarEliminacionDeUnClienteInexistente(idcodigo);
        }
    }

    private void validarEliminacionDeUnClienteInexistente(String idcodigo) throws BusinessException{
        Cliente cliente = buscarCliente(idcodigo);
        if (cliente == null) {
            String mensaje = "Cliente a Eliminar con codigo: " + idcodigo + " no existe.";
            throw new BusinessException(mensaje);
        }
    }


    public void modificarCliente(String idcodigo, String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono, 
            String fechacontacto, String estado, String fechapase) {
        
        Cliente cliente = buscarCliente(idcodigo);
        
        cliente.setNombres(nombres);
        cliente.setApellidopaterno(apellidopaterno);
        cliente.setApellidomaterno(apellidomaterno);
        cliente.setEmail(email);
        cliente.setDni(dni);
        cliente.setTelefono(telefono);
        cliente.setFechacontacto(fechacontacto);
        cliente.setEstado(estado);

    }
    
    public void clienteDebeConvertirAProspecto(String idcodigo) throws BusinessException{
        
        modificarClienteDebeValidarEstado(idcodigo, "", "", "", "", "", "", "", "C", "");
        
    }
    
    public void modificarClienteDebeValidarEstado(String idcodigo, String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono, 
            String fechacontacto, String estado, String fechapase) throws BusinessException{
        
        // Indicador para saber si se realizo algun cambio
        boolean cambio = false;
        
        // Busca Cliente
        Cliente cliente = buscarCliente(idcodigo);
        if (cliente != null) {
            if (objVal.isSet(nombres)) {
                cliente.setNombres(nombres); cambio = true;
            }
            if (objVal.isSet(apellidopaterno)) {
                cliente.setApellidopaterno(apellidopaterno); cambio = true;
            }
            if (objVal.isSet(apellidomaterno)) {
                cliente.setApellidomaterno(apellidomaterno);
            }
            if (objVal.isSet(email)) {
                cliente.setEmail(email); cambio = true;
            }
            if (objVal.isSet(dni)) {
                cliente.setDni(dni); cambio = true;
            }
            if (objVal.isSet(telefono)) {
                cliente.setTelefono(telefono); cambio = true;
            }
            if (objVal.isSet(fechacontacto)) {
                cliente.setFechacontacto(fechacontacto); cambio = true;
            }

            if (objVal.isSet(estado)) {
                // Dar de Alta Prospecto
                // valido Prospecto que fue transformado a Cliente y tiene el mismo DNI                
                // equalsIgnoreCase => Compara dos cadenas, ignorando consideraciones de mayúsculas y minúsculas                
                if (estado.equalsIgnoreCase("C") && cliente.getEstado().equalsIgnoreCase("C")) {
                    if (filtroClienteListar("", "", "", "", cliente.getDni(), "", "").size() > 0) {
                        throw new BusinessException("El Cliente '" + idcodigo + "' ya ha sido dado de alta");
                    }
                }
                
//                if (estado.equalsIgnoreCase("C") && cliente.getEstado().equalsIgnoreCase("P")) {
//                    if (filtroClienteListar("", "", "", "", cliente.getDni(), "", "").size() > 0) {
//                        throw new BusinessException("Ya existe un Cliente registrado con el DNI[" + cliente.getDni() + "]que tiene el Cliente actual");
//                    }
//                } else if (estado.equalsIgnoreCase("C") && cliente.getEstado().equalsIgnoreCase("C")) {
//                    throw new BusinessException("El Cliente '" + idcodigo + "' ya ha sido dado de alta");
//                }
                
                cliente.setEstado(estado); cambio = true;
            }
            
            // Reviso si hay cambios
            if (cambio) {
                if (objVal.isSet(estado)) {
                    throw new BusinessException("Se ha modificado satisfactoriamente el Cliente");
                }
            }

        }
        
        // Si no encuentra ningun registro
        throw new BusinessException("No se ha encontrado ningun Registro");
    }
    

    public ArrayList<Cliente> filtroCliente(String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono, 
            String fechacontacto) throws BusinessException {
        
        ArrayList<Cliente> filtros = new ArrayList<Cliente>();
        //filtros = new ArrayList<Cliente>();
        
        for (Cliente objCli : clientes) {
            if (objCli.getNombres().contains(nombres) &&
                    objCli.getApellidopaterno().contains(apellidopaterno) &&
                    objCli.getApellidomaterno().contains(apellidomaterno) &&
                    objCli.getEmail().contains(email) &&
                    objCli.getDni().contains(dni) &&
                    objCli.getTelefono().contains(telefono) &&
                    objCli.getFechacontacto().contains(fechacontacto)) {
                filtros.add(objCli);
            }
        }
        if (filtros.size() == 0){
            String mensaje = "No se encontraron registros para los filtros ingresados";
            throw new BusinessException(mensaje);
        } else {
            String mensaje = "Se encontraron: ";
            throw new BusinessException(mensaje + filtros.size() + " coincidencias");
        }
        
    }
    
    
    public ArrayList<Cliente> filtroClienteListar(String nombres, String apellidopaterno, 
            String apellidomaterno, String email, String dni, String telefono, 
            String fechacontacto) {
        
    ArrayList<Cliente> filtros = new ArrayList<Cliente>();
    //filtros = new ArrayList<Cliente>();

    for (Cliente objCli : clientes) {
        if (objCli.getNombres().contains(nombres) &&
                objCli.getApellidopaterno().contains(apellidopaterno) &&
                objCli.getApellidomaterno().contains(apellidomaterno) &&
                objCli.getEmail().contains(email) &&
                objCli.getDni().contains(dni) &&
                objCli.getTelefono().contains(telefono) &&
                objCli.getFechacontacto().contains(fechacontacto)) {
            filtros.add(objCli);
        }
    }
    return filtros;
    
    }
    
    

    
}
